package futbol.tacticas.concursantes.TacticaCaccy;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Vector;

import org.omg.PortableInterceptor.DISCARDING;

import futbol.Futbol;
import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;

public class Basic extends Skills
{
	Manager tecnico;
	//private static Logger log = Logger.getLogger(Basic.class);
	
	public Basic(int numJugador, int xInicial, int yInicial,int fuerza, Manager tec,Defense escuadra) {
		super(numJugador, xInicial, yInicial, fuerza, tec,escuadra);
		// TODO Auto-generated constructor stub
		tecnico = tec;
		
	}

	@Override
	public Vector<Comando> getComandos() 
	{	
		Vector<Comando> comandos =new Vector<Comando>();
		Ball pilota = tecnico.getMiPelota();
		Skills rebotador1 = tecnico.getAlineacion()[1];
		Skills rebotador2 = tecnico.getAlineacion()[2];
		Play jugs[] = tecnico.getMejoresInterceptores();
        Skills compis[] = tecnico.getAlineacion();
        
		
		comandos.add( new ComandoIrA(numero,xInicial,yInicial));
        
		
		if(this.distance(pilota) <= 10&&pilota.velocidad<15)
		{
			
	        if(FutbolTools.getDistanciaCritica(fuerza) > this.distance(160,0)||!tecnico.contrariEnTrajectoriaPorteria(this, pilota))
	        {
	        	//log.debug("jugador "+numero+"--> tiro a porta");
	        	Point2D.Double p = tecnico.canyonazo(pilota, 160, 0);
	        	comandos.add(new ComandoGolpearBola(numero,p.x,p.y));	 
	        }
	        else
	        {
	        	
	        	double []puntPase = paseBasico(numero);
	        	if(puntPase!=null)
	        	{
	        		//log.debug("jugador "+numero+"--> paseBasico!");
	        		comandos.add(new ComandoGolpearBola(numero,puntPase[0],puntPase[1]));
	        	}
	        	
	        	else
	        	{
	        		Point2D p;
	        		Point2D.Double puntoDeseado = null;
	        		if(rebotador1.distance(x, y) > rebotador2.distance(x, y))
						puntoDeseado = new Point2D.Double(rebotador1.getX(), rebotador1.getY());
						
					else
						puntoDeseado = new Point2D.Double(rebotador2.getX(), rebotador2.getY());
	        		
	        		
	        		if(emPrenenLaPilota(this, puntoDeseado))
	        		{
	        			
	        			//log.debug("jugador "+numero+"--> despejo!"); 
	        			p = tecnico.despejarPelota(numero);
	        			comandos.add(new ComandoGolpearBola(this.numero, p.getX(),p.getY()));
	        		}
	        		else
	        		{
	        			
		        		//log.debug("jugador "+numero+"--> regateo!"); 
		        		
						double[] posicion = new double[2];
						
						
						
						posicion = 	tecnico.irHaciaConEvasion(	this, tecnico.getRutasLibres(this, 30, puntoDeseado, Math.toRadians(130)), puntoDeseado);
						
						if(posicion==null){
							
							p = tecnico.despejarPelota(numero);
		        			comandos.add(new ComandoGolpearBola(this.numero, p.getX(),p.getY()));
						}else{
							
							comandos.add(new ComandoIrA(numero, posicion[0], posicion[1]));
							
							p = tecnico.getPosicionDeToque(posicion[0],posicion[1], pilota,2);
							double a = FutbolTools.calcAngulo(posicion[0],posicion[1], p.getX(), p.getY());
							//log.debug("anguloParaPelota2:"+Math.toDegrees(a));
							
							double[] puntoPreciso = FutbolTools.toquePreciso(this, pilota.getCopia(), p.getX(), p.getY());
							
							comandos.add(new ComandoGolpearBola(this.numero, puntoPreciso[0], puntoPreciso[1]));
						}
	        		}
	        	}
	        }
		}
		
		else
		{	if(tecnico.tenemosPelota()>=0)
			{
				if(jugs[0].indiceJugador == numero)
				{comandos.add(new ComandoIrA(numero, jugs[0].puntoObjetivo.getX() , jugs[0].puntoObjetivo.getY()));
				}
				else if(jugs[1].indiceJugador == numero && compis[(jugs[0].indiceJugador)].distance(pilota) > 10)
				{
					comandos.add(new ComandoIrA(numero, jugs[1].puntoObjetivo.getX() , jugs[1].puntoObjetivo.getY()));
				}
				else
				{
					}
			}
			
			else
			{
				if(jugs[0].indiceJugador == numero)
				{
					comandos.add(new ComandoIrA(numero, jugs[0].puntoObjetivo.getX() , jugs[0].puntoObjetivo.getY()));
				}
				else if(jugs[1].indiceJugador == numero)
				{
					comandos.add(new ComandoIrA(numero, jugs[1].puntoObjetivo.getX() , jugs[1].puntoObjetivo.getY()));
				}
				else
				{
					
					comandos.add(new ComandoIrA(numero, this.xInicial,this.xInicial));
				}
			}
		}
	    return comandos;
	}

	
	
	
	public double[] paseBasico(int jugadorOrigen)
	{
		int [][]rebotadors = new int[10][2];
		int cont = 0,i;
		int jugadorDesti = jugadorOrigen;
		
		double p[]=null;
		for(i=0;i<11;i++)
		{
			if(tecnico.getAlineacion()[i] instanceof AttSkills 
				&& i != jugadorOrigen)
			{
				rebotadors[cont][0] = i;
				cont++;
			}
		}
		int maxFactor = -1;
		for(i=0;i<cont;i++)
		{
			rebotadors[i][1] = tecnico.contrariEnTrajectoria(tecnico.getAlineacion()[jugadorOrigen], tecnico.getBola().getCopia(), rebotadors[i][0]);
			if(rebotadors[i][1] >= maxFactor)
			{
				maxFactor = rebotadors[i][1];
				jugadorDesti = rebotadors[i][0];
			}
		}
		if(maxFactor >= 0)
		{
			//log.debug("jugador "+numero+"--> paso a rebotador!");
			p = FutbolTools.pasePreciso(tecnico.getAlineacion()[jugadorOrigen], tecnico.getBola().getCopia(), jugadorDesti);
			Point jugadorRecibePase = sj.getMisJugadores()[jugadorDesti];
			
		}
		
		if(p == null)
		{
			jugadorDesti = jugadorOrigen;
			jugadorDesti = tecnico.paseSegur(tecnico.getAlineacion()[jugadorOrigen], 20,true);
		
			if(jugadorDesti != jugadorOrigen)
			{
				//log.debug("jugador "+numero+"--> pase segur endavan a "+jugadorDesti);
				p = FutbolTools.pasePreciso(tecnico.getAlineacion()[jugadorOrigen], tecnico.getBola(), jugadorDesti);
				Point jugadorRecibePase = sj.getMisJugadores()[jugadorDesti];
			
			}
		}
		
		if(p == null)
		{
			for(i=0;i<11;i++)
			{	p = tecnico.paseRebote(tecnico.getAlineacion()[jugadorOrigen], tecnico.getBola().getCopia(), tecnico.getAlineacion()[i]);
				if(p!=null)
					break;//log.debug("jugador "+numero+"--> puc fer rebote a "+i);
			}
			//if(p!=null)
				//log.debug("jugador "+numero+"--> paso rebote a "+i);
		}
		
		
		return p;
	}
	

	
	private boolean emPrenenLaPilota(Skills jugador, Point2D puntoDeseado)
	{
		double[] posicion = new double[2];
		
		posicion = 	tecnico.irHaciaConEvasion(	jugador,
				tecnico.getRutasLibres(jugador, 30, puntoDeseado),
				puntoDeseado);
		
		if(posicion==null)
		{
			//log.debug("posicion == null");
			return true;
		}
		
		Point2D.Double toque = tecnico.getPosicionDeToque(posicion[0], posicion[1], tecnico.getMiPelota(), 2);
		
	
		double[] toquePos = FutbolTools.toquePreciso(jugador, tecnico.getMiPelota().getCopia(), toque.x, toque.y);
		
		Ball pelotaHipo = FutbolTools.createPelotaSegunDestino(jugador, jugador.fuerza, tecnico.getMiPelota(), toquePos[0], toquePos[1]);
		
		ArrayList<Ball> tray = new ArrayList<Ball>();
		
		FutbolTools.calculTrajectoria(pelotaHipo, tray);
		
		
		Play h = tecnico.getMejoresInterceptoresContrariosHipotetico(tray, null)[0];
		
		return ( h.indicePelota == 0 );
	}
	
}
